package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.commo.PageResult;
import com.itheima.commo.R;
import com.itheima.entity.Employee;
import com.itheima.exception.BusinessException;
import com.itheima.mapper.EmployeeMapper;
import com.itheima.service.EmployeeService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;

import javax.servlet.http.HttpSession;


//员工业务处理层接口实现类

@Service
@Transactional
@Slf4j
public class EmployeeServiceImpl implements EmployeeService {
    @Autowired
    private EmployeeMapper employeeMapper;


    @Autowired
    private EmployeeService employeeService;


    /**
     * 后台登录功能
     *
     * @param employee
     */
    @Override
    public R<Employee> login(Employee employee, HttpSession httpSession) {
        //1.根据用户名查询emploee表 用户是否存在
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Employee::getUsername, employee.getUsername());
        Employee ey = employeeMapper.selectOne(lqw);
        //2.如果用户名不存在 返回用户名不存在提示信息
        if (ey == null) {
            return R.error("用户名不存在");
        }
        if (ey.getStatus() != 1) {
            return R.error("登录失败：此用户被禁止登录");
        }
        //将员工对象放入session
        httpSession.setAttribute("employee", ey);
        //3.如果用户名存在 用户输入的密码 跟 数据库中密码进行对比
        String userPassword = employee.getPassword();
        String dbPassword = ey.getPassword();
        //3.1 md5介绍 将明文123456进行md5加密得到值 跟数据库中密文进行对比
        String newPassword = DigestUtils.md5DigestAsHex(userPassword.getBytes());
        //4.密码错误 返回密码输入错误提示信息
        if (newPassword.equals(dbPassword)) {
            return R.success(ey, "登录成功了");
        } else {
            return R.error("登录失败：输入的密码与系统密码不一致");
        }
    }

    /**
     * 退出
     *
     * @param httpSession
     */
    @Override
    public void logout(HttpSession httpSession) {
        //方式一：session作用域移除employee对象 缓存并未释放
        httpSession.invalidate();
    }

    /**
     * 新增员工
     *
     * @param employee
     * @return
     */
    @Override
    public int save(Employee employee, Long loginUserId) {
        long id = Thread.currentThread().getId();
        log.debug("**LoginCheckFilter**线程id{}**", id);

        //根据username查询员工表
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();

        //eq 第一个参数 true false决定是否添加此条件 employee.getUsername() != null
        lqw.eq(StringUtils.isNotEmpty(employee.getUsername()), Employee::getUsername, employee.getUsername());
        //如果员工username存在 抛出业务异常
        Integer count = employeeMapper.selectCount(lqw);
        if (count > 0) {
            log.debug("用户" + employee.getUsername() + "已经存在了");
            throw new BusinessException("用户" + employee.getUsername() + "已经存在了");
        }
        //新增员工账号 设置默认密码
        employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes()));
        //新增员工账号 设置默认状态 1：启用 0：禁用
        employee.setStatus(1);
        //新增员工账号 创建时间
       /* employee.setCreateTime(LocalDateTime.now());
        //新增员工账号 更新时间
        employee.setUpdateTime(LocalDateTime.now());
        //新增员工账号 创建用户人
        employee.setCreateUser(loginUserId);
        //新增员工账号 更新用户人
        employee.setUpdateUser(loginUserId);*/
        return employeeMapper.insert(employee);
    }


    /**
     * 员工分页
     * 使用mybatisPlus分页
     * 1.配置分页插件
     * 2.findPage方法中使用api进行分页
     * 2.1 new Page(page,pageSize)
     * 2.1.1 添加name条件
     * 2.2 selectPage 进行分页
     * 2.3 将page对象中total records 封装到PageResult对象中
     *
     * @param page
     * @param pageSize
     * @param name
     * @return
     */
    @Override
    public PageResult<Employee> findPage(Long page, Long pageSize, String name) {
        // 2.1 new Page(page,pageSize)
        Page pp = new Page(page, pageSize);
        //2.1.1 添加name条件
        LambdaQueryWrapper<Employee> lqw = new LambdaQueryWrapper<>();
        lqw.eq(StringUtils.isNotEmpty(name), Employee::getName, name);
        //2.2 selectPage 进行分页
        employeeMapper.selectPage(pp, lqw);
        //2.3 将page对象中total records 封装到PageResult对象中a
        log.debug("员工分页记录数{}，当前页面数据{}", pp.getTotal(), pp.getRecords());
        return new PageResult<>(pp.getTotal(), pp.getRecords());
    }


    /**
     * 更新员工（不仅限于状态更新 员工启用 禁用）
     *
     * @param employee
     */
    @Override
    public int update(Employee employee, Long loginUserId) {
        long id = Thread.currentThread().getId();
        log.debug("**LoginCheckFilter**线程id{}**", id);
        //1.修改更新时间
       /* employee.setUpdateTime(LocalDateTime.now());
        //2.修改最后更新人
        employee.setUpdateUser(loginUserId);
        //3.调用dao更新员工信息*/
        return employeeMapper.updateById(employee);
    }


    /**
     * 根据员工id查询员工信息
     *
     * @param id
     */
    @Override
    public Employee findById(Long id) {
        return employeeMapper.selectById(id);
    }
}
